package com.buba.system.service.impl;

import com.buba.system.dao.MenuMapper;
import com.buba.system.pojo.Job;
import com.buba.system.pojo.Menu;
import com.buba.system.pojo.Page;
import com.buba.system.service.MenuService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
@DubboService
public class MenuServiceImpl implements MenuService {
    private MenuMapper menuMapper;

    @Override
    public List<Menu> selMenu(Integer jobId) {
        return menuMapper.selMenu(jobId);
    }

    /**
     * 根据职位获得相应菜单
     *
     * @param jobList 职位集合
     * @return 菜单集合
     */
    @Override
    public List<Menu> noDup(List<Job> jobList) {
        // 使用Set的特性，去除重复数据。
        // 当使用Set集合去重时，需要考虑是根据对象的内容去重还是根据内存地址去重
        // 要想根据对象内容去重，必须给对象重写hashCode() equals()方法
        Set<Menu> menuSet = new TreeSet<>();
        for (Job job : jobList)
            // 遍历该职位所拥有的菜单
            for (Menu menu : job.getMenuList())
                // 把菜单放入Set集合中去重
                menuSet.add(menu);
        // 实现菜单的层级效果，用于装入调整好的菜单返回
        List<Menu> menuList = new ArrayList<>();
        // 遍历Set集合
        for (Menu menu : menuSet) {
            // 当菜单的pid是0时，说明该菜单是父级菜单
            // 意味着该菜单下拥有子集菜单
            if (menu.getMenuPid() == 0) {
                // 用于装入子集菜单
                List<Menu> subMenuList = new ArrayList<>();
                // 在遍历Set集合，寻找该菜单下的子集
                for (Menu subMenu : menuSet) {
                    //当子集的Pid等于父级的id时，说明该菜单是它的子集
                    if (subMenu.getMenuPid() == menu.getMenuId())
                        // 把该菜单装入子集集合中
                        subMenuList.add(subMenu);
                }
                // 把该父级菜单的子集集合赋值
                menu.setSubMenu(subMenuList);
                // 当调整好的层级菜单，装入要返回的集合中
                menuList.add(menu);
            }
        }
        return menuList;
    }

    @Override
    public List<Menu> selMenuAll() {
        List<Menu> list= menuMapper.selMenuAll();
        list.forEach(s->{
            if(s.getMenuPid()==0)
                s.setOpen(true);
        });
        return list;
    }
    @Override
    public Integer addMenu(Map<String, Object> map) {
        return menuMapper.addMenu(map);
    }

    @Override
    public List<Menu> selMenuById(Integer jobId) {
        //查询所有职位权限
        List<Menu> list= menuMapper.selMenuAll();
        //根据Id查询所拥有的职位
        List<Menu> list1= menuMapper.selMenuById(jobId);
        list.forEach(s->{
            if(s.getMenuPid()==0)
                s.setOpen(true);
            list1.forEach(s1->{
                if(s.getMenuId()==s1.getMenuId())
                    s.setChecked(true);
            });

        });
        return list;
    }

    @Override
    public Integer delMenuById(Integer jobId) {
        return menuMapper.delMenuById(jobId);
    }

    @Override
    public Long selMenuCount() {
        return menuMapper.selMenuCount();
    }

    @Override
    public List<Menu> selMenuAlll(Page page) {
        return menuMapper.selMenuAlll(page);
    }

    @Autowired
    public void setMenuMapper(MenuMapper menuMapper) {
        this.menuMapper = menuMapper;
    }
}
